package jiang.ThreadPool;

import java.util.concurrent.*;

/**
 * @ClassName TestCachedThreadPool
 * @Description: 创建cachedThreadPool
 * @Author jiangshitao
 * @Date 2023/1/28
 */
public class TestCachedThreadPool {

    /**
     * 可缓存无界线程池测试
     * 当线程池中的线程空闲时间超过60s则会自动回收该线程，核心线程数为0
     * 当任务超过线程池的线程数则创建新线程。线程池的大小上限为Integer.MAX_VALUE，
     * 可看做是无限大。
     */
    public void cacheThreadPoolTest() {
        /*
         * 线程池的七大核心参数：
         * corePoolSize:核心线程池大小
         * maximumPoolSize:最大核心线程池大小
         * keepAliveTime:空闲线程存活时间
         * unit:时间单位
         * workQueue:阻塞队列
         * threadFactory:线程工厂：创建线程的，一般不用动
         * handler:拒绝策略
         * 四大拒绝策略：
         * new ThreadPoolExecutor.AbortPolicy() // 不执行新任务，直接抛出异常，提示线程池已满
         * new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里！由调用线程处理该任务
         * new ThreadPoolExecutor.DiscardPolicy() // 不执行新任务，也不抛出异常
         * new ThreadPoolExecutor.DiscardOldestPolicy() // 丢弃队列最前面的任务，然后重新提交被拒绝的任务。
         */
        // 阿里要求手动创建线程池来避免资源耗尽
        ExecutorService executorService = new ThreadPoolExecutor(
                0, Integer.MAX_VALUE,
                60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>(),
                new TestThreadPoolFactory("cachedThread"));

        for (int i = 0; i < 10; i++) {
            executorService.submit(() -> {
                        System.out.println(Thread.currentThread().getName());
                    }
            );
        }
    }

    public static void main(String[] args) {
        TestCachedThreadPool testCachedThreadPool = new TestCachedThreadPool();
        long startTime = System.currentTimeMillis();
        testCachedThreadPool.cacheThreadPoolTest();
        long endTime = System.currentTimeMillis();
        System.out.println("共耗时：" + (endTime-startTime) + "ms");
    }
}
